package martin.tpfinal.reconocer.wavToCoef.htk;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import martin.tpfinal.reconocer.FilePath;
import martin.tpfinal.reconocer.wavToCoef.WavToCoef;

public class WavToCoefHtk implements WavToCoef{

	private static final String pathHTK="C:\\cygwin\\HTK\\htk-3.3-windows-binary\\htk\\";
	
	public WavToCoefHtk(){
		
	}
	
	/**
	 * Transforma un archivo wav, en un archivo con todos los coeficientes de mfcc que se corresponden a ese archivo
	 * @param wavFile es el archivo que contiene el wav 
	 * @param outFileName es el archivo donde guardare el resultado de la transformacion
	 */
	@Override
	public void transform(File wavFile,File destFile){

		//pasar el wav a mfcc
		String pathWavFile=wavFile.getAbsolutePath();
//		String pathTempFile=wavFile.getParent()+File.separator+"tempFile.txt";
		
//		aplicarHCopy(pathWavFile,pathTempFile);


//		String pathOrigFile=pathTempFile;
		String pathDestFile=destFile.getAbsolutePath();

		//pasar el mfcc a texto
		aplicarHList(pathWavFile,pathDestFile);
		
		//en el pathDestFile queda guardado el archivo con los coef mfcc
		
	}

	
	/*
	1. source header: requested using the -h option
	2. target header: requested using the -t option
	3. target data: printed by default. The begin and end samples of the displayed data can be
	specified using the -s and -e options.
	*/
	private void aplicarHList(String pathOrigFile, String pathDestFile) {
		//Hlist -C config -h -t -o -i 39 aseguraWav\\coefmfcc\\asegura-01.txt > aseguraWav\\coefmfcctexto\\aseg-01.txt

		String cmd=pathHTK+"HList";

		String pathConfigFile = (new FilePath()).getPathToDirectoryFile()+"config";
        		
		File arch=new File(pathConfigFile);
        if (!arch.exists()){
        	System.out.println("No existe el archivo de configuracion para ejecutar HCopy, en el directorio "+pathConfigFile);
        	System.out.println("esto puede provacar el fracaso del reconocimiento");
        }
        else {
        	cmd+=" -C "+pathConfigFile;
		}

        cmd+=" -h -t -o -i 39 "+pathOrigFile;//+" > "+pathDestFile;
		
		
//		String cmd=pathHTK+"HList -h -t -o -i 39 "+pathOrigFile+" > "+pathDestFile;
		
        List<String> resultadoString = executeCommand(cmd);		
		
        //genero el archivo de salida con el string que recibi 
        File file = new File(pathDestFile);
        if (!file.exists()){
            try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
	        
        PrintWriter writer;
        try {
	            
            writer = new PrintWriter(file);
            Iterator<String> iterator= resultadoString.iterator();
            while (iterator.hasNext())
                writer.print(iterator.next()+"\n");
	            
            writer.close();
	        
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

	}


	private List<String> executeCommand(String cmd) {
		Process pr;
		BufferedReader input;
		String line;
		Runtime rt=Runtime.getRuntime();
		
        String[] msg = {"", ""};
        line = null;

        List<String> resultado = new ArrayList<String>();
        try {
            // execute command
            pr = rt.exec(cmd);

            // read message from console
            input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
            while ((line = input.readLine()) != null) {
                msg[0] = msg[0] + "\t" + line + "\n";
                resultado.add(line);
            }

            // read error message
            input = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
            while ((line = input.readLine()) != null) {
                msg[1] = msg[1] + "\t" + line + "\n";
            }
            if (msg[1].length() > 1) {
                try {
					throw new Exception("\t" + cmd + "\n" + msg[0] + "\n" + msg[1]);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
            }
//            System.out.println( "Executed command: \"" + cmd + "\"\n");
        } catch (IOException ex) {
            try {
				throw new IOException("Error while executing cmd: " + cmd + "\n" + msg[0] + "\n" + msg[1], ex);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        }

		return resultado;
	}
	


}
